let { AsyncParallelHook } = require('tapable')

class Lesson1 {
  constructor () {
    this.index = 0
    this.hooks = {
      arch: new AsyncParallelHook(['name'])
    }
  }

  // 注册监听函数
  tap () {
    this.hooks.arch.tapAsync('node', (name, cb) => {
      console.log('node', name)
      setTimeout(() => {
        console.log('async node')
        // cb(name) 如果加了参数，任何一个完成的时候，就会全部完成。
        cb()
      }, 1000)
    })
    this.hooks.arch.tapAsync('react', (name, cb) => {
      console.log('react', name)
      setTimeout(() => {
        console.log('async react')
        // cb(name) 如果加了参数，任何一个完成的时候，就会全部完成。
        cb()
      }, 1000)
    })
  }

  start () {
    this.hooks.arch.callAsync('xyf', (err) => {
      console.log('end', err)
    })
  }
}

let l1 = new Lesson1()

l1.tap()
l1.start() // 启动钩子

console.log('----------------------------------')

class Lesson2 {
  constructor () {
    this.index = 0
    this.hooks = {
      arch: new AsyncParallelHook(['name'])
    }
  }

  // 注册监听函数
  tap () {
    this.hooks.arch.tapPromise('node', (name) => {
      return new Promise(((resolve, reject) => {
        console.log('async node')
        setTimeout(() => {
          console.log('node', name)
          // cb(name) 如果加了参数，任何一个完成的时候，就会全部完成。
          resolve(1)
        }, 1000)
      }))
    })
    this.hooks.arch.tapPromise('react', (name) => {
      return new Promise(((resolve, reject) => {
        console.log('async react')
        setTimeout(() => {
          console.log('async react')
          // cb(name) 如果加了参数，任何一个完成的时候，就会全部完成。
          resolve(2)
        }, 1000)
      }))
    })
  }

  start () {
    this.hooks.arch.promise('xyf').then((err) => {
      console.log('end', err)
    })
  }
}

let l2 = new Lesson2()

l2.tap()
l2.start() // 启动钩子

